# 1. 指定CMake最低版本要求
cmake_minimum_required(VERSION 3.10)

# 2. 设置项目信息
project(
    704BinarySearch            # 项目名称
    VERSION 1.0.0           # 项目版本
    DESCRIPTION "Simple C++ Project"
    LANGUAGES CXX           # 支持的语言
)

# 3. 设置C++标准和编译特性
set(CMAKE_CXX_STANDARD 17)       # 使用C++17标准
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # 必须支持指定标准
set(CMAKE_CXX_EXTENSIONS OFF)    # 禁用编译器特有扩展

# 4. 配置构建类型和编译选项
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release) # 默认构建类型为Release
endif()

# 公共编译选项
# 修改后 - 分开添加选项
add_compile_options(
    "$<$<CONFIG:Release>:-O3>"       # Release模式优化
    "$<$<CONFIG:Debug>:-g3>"
    "$<$<CONFIG:Debug>:-O0>"
)

# 平台特定选项
if(MSVC)
    add_compile_options(/W4 /WX) # MSVC: 警告等级4，视警告为错误
else()
    add_compile_options(-Wall -Wextra -Wpedantic -Werror) # GCC/Clang: 严格警告
endif()

# 5. 查找依赖包
# find_package(Boost 1.70 COMPONENTS filesystem system)

# 6. 包含目录设置
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/include  # 项目头文件目录
)

# 7. 源文件收集
file(GLOB_RECURSE SOURCES "src/*.cpp")   # 递归收集源文件
file(GLOB_RECURSE HEADERS "include/*.h")  # 头文件

# 8. 创建目标
# 可执行文件目标
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})

# 9. 链接依赖库
if(Boost_FOUND)
    target_link_libraries(${PROJECT_NAME}
        PRIVATE
            Boost::filesystem
            Boost::system
    )
endif()

# 10. 安装规则
install(TARGETS ${PROJECT_NAME}
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
)

install(DIRECTORY include/ DESTINATION include)

# 11. 测试支持
enable_testing()

# 12. 附加功能
# 12.1 Windows资源文件
if(WIN32 AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/app.rc)
    target_sources(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/app.rc)
endif()

# # 12.2 预编译头文件
# target_precompile_headers(${PROJECT_NAME} PRIVATE
#     <vector>
#     <string>
#     <memory>
#     ${PROJECT_SOURCE_DIR}/include/pch.h
# )

# 13. 生成配置文件
# 13.1 导出头文件路径
target_include_directories(${PROJECT_NAME}
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
)

# 13.2 生成版本信息
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.hpp.in
    ${CMAKE_CURRENT_BINARY_DIR}/Version.hpp
)

# 14. 自定义目标
add_custom_target(run
    COMMAND ${PROJECT_NAME}
    DEPENDS ${PROJECT_NAME}
    COMMENT "Running ${PROJECT_NAME}..."
)

# 15. 包管理器集成
include(CPack)